/**
 * 认证相关服务
 */

// 封装获取用户信息的函数
export async function fetchCurrentUser(options?: { 
  retryCount?: number,
  retryDelay?: number,
  maxRetries?: number,
  onRetry?: (retryCount: number, error: any) => void
}) {
  const {
    retryCount = 0,
    retryDelay = 1000,
    maxRetries = 3,
    onRetry
  } = options || {};

  try {
    // 获取token
    const token = localStorage.getItem('token');
    if (!token) {
      return { 
        success: false, 
        error: 'no_token',
        message: '未登录或会话已过期' 
      };
    }

    console.log(`获取用户信息 ${retryCount > 0 ? `(重试 ${retryCount}/${maxRetries})` : ''}`);

    // 调用API
    const response = await fetch('/api/auth/me', {
      headers: {
        'Authorization': `Bearer ${token}`
      },
      cache: 'no-cache' // 避免缓存错误响应
    });

    // 处理响应
    if (!response.ok) {
      const status = response.status;
      const errorText = await response.text().catch(() => '');
      let errorJson: any = null;
      
      // 尝试解析错误JSON
      try {
        errorJson = JSON.parse(errorText);
      } catch (e) {
        // 解析失败，不处理
      }
      
      const errorMessage = errorJson?.error || `服务器错误 (${status})`;
      console.error(`获取用户信息失败: ${status}`, errorMessage);

      // 根据错误码处理
      if (status === 401) {
        localStorage.removeItem('token'); // 清除无效token
        return { 
          success: false, 
          error: 'unauthorized',
          message: '登录已过期，请重新登录',
          status
        };
      }

      // 服务器错误，尝试重试
      if (status >= 500 && retryCount < maxRetries) {
        console.log(`服务器错误，${retryDelay/1000}秒后重试...`);
        
        // 通知调用者正在重试
        if (onRetry) {
          onRetry(retryCount + 1, { status, message: errorMessage });
        }
        
        // 延迟后重试
        await new Promise(resolve => setTimeout(resolve, retryDelay));
        return fetchCurrentUser({
          retryCount: retryCount + 1,
          retryDelay: retryDelay * 1.5, // 指数退避
          maxRetries,
          onRetry
        });
      }

      // 重试失败或不可重试的错误
      return { 
        success: false, 
        error: 'api_error',
        message: errorMessage,
        status
      };
    }

    // 成功获取用户数据
    const data = await response.json();
    
    if (!data.user) {
      console.error('响应中缺少用户数据');
      return { 
        success: false, 
        error: 'invalid_response',
        message: '服务器返回的数据格式无效'
      };
    }

    return {
      success: true,
      user: data.user
    };
  } catch (error) {
    console.error('获取用户信息过程中发生错误:', error);
    
    // 网络错误等情况下重试
    if (retryCount < maxRetries) {
      console.log(`发生错误，${retryDelay/1000}秒后重试...`);
      
      // 通知调用者正在重试
      if (onRetry) {
        onRetry(retryCount + 1, error);
      }
      
      // 延迟后重试
      await new Promise(resolve => setTimeout(resolve, retryDelay));
      return fetchCurrentUser({
        retryCount: retryCount + 1,
        retryDelay: retryDelay * 1.5, // 指数退避
        maxRetries,
        onRetry
      });
    }

    // 重试失败
    return { 
      success: false, 
      error: 'network_error',
      message: error instanceof Error ? error.message : '网络请求失败',
    };
  }
} 